package com.pic.mgt;

import org.apache.commons.cli.ParseException;
import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;
import org.apache.log4j.PropertyConfigurator;

import com.pic.mgt.cli.CommandLineArgParser;
import com.pic.mgt.cli.IgalaxyCLI;

public class Main implements Daemon {
	
	private static DaemonContext jsvcDatmonContext;
	
	private static final String haishinLog4jPropsPathStr;
	private static final String syushinLog4jPropsPathStr;
	
	static {
		haishinLog4jPropsPathStr =
			"config/system/haishin/log4j/log4j.properties";
		syushinLog4jPropsPathStr = 
			"config/system/syushin/log4j/log4j.properties";
	}
	
	@Override
	/**
	 * 使用 Jsvn wrapper 帶程式時會呼叫此方準做初始化
	 */
	public void init(DaemonContext arg0) throws DaemonInitException, Exception {
		jsvcDatmonContext = arg0;
	}

	@Override
	/**
	 * 使用 Jsvn wrapper 帶程式做完初始化完後,則呼叫此方法,從這裡開始程式
	 */
	public void start() throws Exception {
		startMain(jsvcDatmonContext.getArguments());
	}

	@Override
	/**
	 * 使用 Jsvn wrapper 停止程式先呼叫
	 */
	public void stop() throws Exception {
		/*
		 *  這裡不作系統結束前的處理，因為已有用 JVM Shutdown hook，
		 *  JVM 在結束前都會先呼叫 JvmShutdownHookHander 類別的執行
		 *  緒，而系統結束前的處理則會在此執行緒完成。
		 */
	}
	
	@Override
	/**
	 * 使用 Jsvn wrapper 停止程式先呼叫 (於 stop()之後呼叫)
	 */
	public void destroy() {
		/*
		 *  這裡不作系統結束前的處理，因為已有用 JVM Shutdown hook，
		 *  JVM 在結束前都會先呼叫 JvmShutdownHookHander 類別的執行
		 *  緒，而系統結束前的處理則會在此執行緒完成。
		 */
	}
	
	public static void main(String[] args) throws SystemLaunchException {
		// throws SystemLaunchException
		startMain(args);
	}
	
	private static void startMain(String[] args) throws SystemLaunchException {
		// Igalaxy 的命令列參數分析
		CommandLineArgParser igalaxyCLI = null;
		try {
			igalaxyCLI = new IgalaxyCLI();
			igalaxyCLI.parse(args);
		} catch (ParseException e) {
			System.out.println("Parsing command line parameters failed.");
			e.printStackTrace();
			System.exit(0);
		}
		
		if (igalaxyCLI.hasArg("launch")) {
			String argValue = igalaxyCLI.getArgValue("launch");
			if (argValue.equals("D")) { // 啟動配信
				// 先指定配信 Log4j 設定檔(log4j.properties)位置
				PropertyConfigurator.configure(haishinLog4jPropsPathStr);
				
				HaishinLauncher haishinLauncher =
								HaishinLauncher.getHaishinLauncher(igalaxyCLI);
				
				// 向 JVM 註冊 Shutdown Hook
				Runtime.getRuntime().addShutdownHook(new JvmShutdownHookHandler());
			}
			else if (argValue.equals("U")) { // 啟動集信
				// 先指定集信 Log4j 設定檔(log4j.properties)位置
				PropertyConfigurator.configure(syushinLog4jPropsPathStr);
				
				SyushinLauncher syushinLauncher =
								SyushinLauncher.getSyushinLauncher(igalaxyCLI);
				
				// 向 JVM 註冊 Shutdown Hook
				Runtime.getRuntime().addShutdownHook(new JvmShutdownHookHandler());
			}
			else {
				// 找不到符合的啟動類別
				igalaxyCLI.outputNoMatchedOptionsMessage();
			}
		}
		else {
			// 找不到符合的命令列參數
			igalaxyCLI.outputNoMatchedOptionsMessage();
		}
	}
}
